<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>C语言基础 - 结构体</title>
    <link rel="stylesheet" href="common.css">
    <style>
        /* 页面特有样式 */
        .struct-card {
            background-color: #f5f9ff;
            border-radius: 8px;
            padding: 20px;
            margin-bottom: 25px;
            border-left: 4px solid #5D9CEC;
        }
        
        .definition-box {
            background-color: #f0f7ff;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .access-box {
            background-color: #fff3e0;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .array-box {
            background-color: #e8f5e9;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .example-box {
            background-color: #f8f8f8;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .warning-note {
            background-color: #ffebee;
            border-left: 4px solid #f44336;
            padding: 12px;
            margin: 15px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>C语言基础入门课程</h1>
        </header>
        
        <nav>
            <a href="index.html">首页</a>
            <a href="02-intro.html">C语言简介与环境搭建</a>
            <a href="03-structure.html" class="current">C程序结构</a>
            <a href="04-datatypes.html">基本数据类型</a>
            <a href="05-variables.html">变量与常量</a>
            <a href="06-operators.html">运算符</a>
            <a href="07-io.html" class="current">输入输出</a>
            <a href="08-conditionals.html">条件语句</a>
            <a href="09-loops.html">循环结构</a>
            <a href="10-functions.html" class="current">函数基础</a>
            <a href="11-scope.html">作用域与存储类</a>
            <a href="12-recursion.html">递归函数</a>
            <a href="13-arrays.html">一维数组</a>
            <a href="14-multidim.html" class="current">多维数组</a>
            <a href="15-strings.html">字符串处理</a>
            <a href="16-pointers.html">指针基础</a>
            <a href="17-pointers_advanced.html" class="current">指针进阶</a>
            <a href="18-structs.html">结构体</a>
            <a href="19-files.html">文件操作</a>
            <a href="20-project.html">综合项目</a>
        </nav>
        
        <main>
            <h2>C语言结构体</h2>
            
            <section>
                <h3>结构体概述</h3>
                <p>结构体是不同类型数据的集合，用于表示复杂的数据结构。</p>
            </section>
            
            <div class="struct-card">
                <h3>1. 结构体定义</h3>
                
                <div class="definition-box">
                    <h4>基本语法</h4>
                    <pre><code>struct 结构体标签 {
    数据类型 成员1;
    数据类型 成员2;
    // ...
};</code></pre>
                    
                    <h4>示例：学生结构体</h4>
                    <pre><code>struct Student {
    int id;          // 学号
    char name[20];   // 姓名
    float score;     // 成绩
};</code></pre>
                </div>
                
                <div class="definition-box">
                    <h4>结构体变量声明</h4>
                    <pre><code>// 方式1: 先定义结构体类型，再声明变量
struct Student stu1;

// 方式2: 定义类型同时声明变量
struct Student {
    int id;
    char name[20];
} stu2, stu3;

// 方式3: 使用typedef创建别名
typedef struct {
    int id;
    char name[20];
} Student;
Student stu4;</code></pre>
                </div>
                
                <div class="warning-note">
                    <h4>注意事项</h4>
                    <ul>
                        <li>结构体定义末尾的分号不能省略</li>
                        <li>结构体成员可以是任何数据类型，包括其他结构体</li>
                        <li>结构体定义本身不分配内存，声明变量才分配</li>
                    </ul>
                </div>
            </div>
            
            <div class="struct-card">
                <h3>2. 结构体成员访问</h3>
                
                <div class="access-box">
                    <h4>普通变量成员访问</h4>
                    <p>使用点运算符(.)访问成员：</p>
                    <pre><code>struct Student stu;
stu.id = 1001;
strcpy(stu.name, "张三");
stu.score = 89.5f;

printf("学号: %d\n", stu.id);
printf("姓名: %s\n", stu.name);
printf("成绩: %.1f\n", stu.score);</code></pre>
                </div>
                
                <div class="access-box">
                    <h4>指针变量成员访问</h4>
                    <p>使用箭头运算符(->)访问成员：</p>
                    <pre><code>struct Student *ptr = &amp;stu;
ptr->id = 1002;  // 等价于 (*ptr).id = 1002
strcpy(ptr->name, "李四");
ptr->score = 92.0f;</code></pre>
                </div>
                
                <div class="example-box">
                    <h4>结构体嵌套示例</h4>
                    <pre><code>struct Date {
    int year;
    int month;
    int day;
};

struct Employee {
    int id;
    char name[20];
    struct Date birthday;
    float salary;
};

struct Employee emp = {
    101, 
    "王五", 
    {1990, 5, 15}, 
    8000.0f
};

printf("出生年份: %d\n", emp.birthday.year);</code></pre>
                </div>
            </div>
            
            <div class="struct-card">
                <h3>3. 结构体数组</h3>
                
                <div class="array-box">
                    <h4>定义与初始化</h4>
                    <pre><code>// 定义结构体数组
struct Student class[3] = {
    {1001, "张三", 89.5f},
    {1002, "李四", 92.0f},
    {1003, "王五", 78.5f}
};

// 也可以部分初始化
struct Student class2[10] = {
    {1001, "张三"},  // score初始化为0
    {1002, "李四", 85.0f}
};</code></pre>
                </div>
                
                <div class="array-box">
                    <h4>访问结构体数组元素</h4>
                    <pre><code>// 计算平均成绩
float sum = 0;
for (int i = 0; i < 3; i++) {
    sum += class[i].score;
}
printf("平均成绩: %.2f\n", sum / 3);

// 修改数组元素
class[1].score = 95.0f;</code></pre>
                </div>
                
                <div class="example-box">
                    <h4>综合示例：学生成绩管理</h4>
                    <pre><code>#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

#define MAX_STUDENTS 50

typedef struct {
    int id;
    char name[20];
    float score;
} Student;

void printStudent(Student s) {
    printf("学号: %d\t姓名: %s\t成绩: %.1f\n", 
           s.id, s.name, s.score);
}

int main() {
    Student class[MAX_STUDENTS];
    int count = 0;
    
    // 添加学生
    class[count].id = 1001;
    strcpy(class[count].name, "张三");
    class[count].score = 89.5f;
    count++;
    
    class[count].id = 1002;
    strcpy(class[count].name, "李四");
    class[count].score = 92.0f;
    count++;
    
    // 打印所有学生
    printf("学生列表:\n");
    for (int i = 0; i < count; i++) {
        printStudent(class[i]);
    }
    
    // 计算平均分
    float sum = 0;
    for (int i = 0; i < count; i++) {
        sum += class[i].score;
    }
    printf("平均成绩: %.2f\n", sum / count);
    
    return 0;
}</code></pre>
                </div>
            </div>
        </main>
        
        <footer>
             <p>&copy; </p>
        </footer>
        
        <!-- 二维码区域 -->

    </div> <!-- 结束.container -->
</body>
</html>